Git stashの使い方完全ガイド|コマンド実行例で初心者向け解説
Gitを使った開発を行っている際、「別のブランチに切り替えたいけど、現在の変更をコミットしたくない」という状況に直面することがあります。このような場面で活躍するのがGit stashです。本記事では、Git stashの基本的な使い方から応用まで、初心者でも理解できるよう詳しく解説します。
目次
1. Git stashが必要な原因の説明
Git stashを理解する前に、どのような場面で必要になるのかを説明します。
1-1. 典型的な問題シーン
開発中に以下のような状況が発生することがあります:
- 機能Aの開発途中に、緊急のバグ修正が必要になった → 現在の変更を保存して別のブランチに切り替えたい
- コミット前に別のブランチを確認したい → 変更内容をどこかに保管しておきたい
- 同じファイルへの複数の変更を管理したい → 変更の一部だけを一時保存したい
こうした場合、コミットしないで変更を一時的に保存できれば、ブランチの切り替えがスムーズになります。
1-2. Git stashとは
Git stashは、現在の作業ディレクトリの変更を一時的に保存(スタッシュ)し、クリーンな状態に戻すGitコマンドです。保存した変更は後で復元することができます。
stashの特徴:
- 変更をコミットせずに一時保存できる
- 複数の変更を積み重ねて管理できる
- ブランチの切り替えがスムーズになる
- 保存した変更は後でいつでも復元可能
2. Git stashの解決手順
2-1. 基本的な流れ
Git stashを使う基本的な流れは以下の通りです:
- 現在の変更を確認する → git status
- 変更をスタッシュに保存する → git stash
- 別の作業を行う → ブランチ切り替えなど
- 保存した変更を復元する → git stash pop
2-2. よく使うコマンド一覧
| コマンド | 説明 |
|---|---|
| git stash | 現在の変更を保存してクリーンな状態に戻す |
| git stash list | 保存されたスタッシュの一覧を表示 |
| git stash pop | 最新のスタッシュを復元して削除 |
| git stash apply | 最新のスタッシュを復元(削除しない) |
| git stash drop | 最新のスタッシュを削除 |
| git stash show | 最新のスタッシュの内容を表示 |
3. コード例と実践的な使い方
3-1. 基本的な使い方
ステップ1:現在の変更を確認する
$ git status
On branch feature/user-profile
Changes not staged for commit:
(use \"git add <file>...\" to update the what will be committed)
(use \"git restore <file>...\" to discard changes in working directory)
modified: user.js
modified: profile.html
Untracked files:
(use \"git add <file>...\" to include in what will be committed)
config.tmp
ステップ2:変更をスタッシュに保存する
$ git stash
Saved working directory and index state WIP on feature/user-profile: abc1234 Add user profile page
このコマンドで、user.jsとprofile.htmlの変更が一時保存されます。注意として、Untracked files(追跡されていないファイル)はデフォルトでは保存されません。
ステップ3:スタッシュが保存されたか確認する
$ git status
On branch feature/user-profile
nothing to commit, working tree clean
ワーキングディレクトリがクリーンになりました。
ステップ4:別のブランチに切り替える
$ git checkout hotfix/critical-bug
Switched to branch 'hotfix/critical-bug'
ステップ5:別の作業を完了してから元に戻す
$ git checkout feature/user-profile
Switched to branch 'feature/user-profile'
ステップ6:保存した変更を復元する
$ git stash pop
On branch feature/user-profile
Changes not staged for commit:
(use \"git add <file>...\" to update the what will be committed)
modified: user.js
modified: profile.html
Dropped refs/stash@{0} (abcd1234567890)
3-2. 複数のスタッシュを管理する
スタッシュの一覧を表示する
$ git stash list
stash@{0}: WIP on feature/user-profile: abc1234 Add user profile page
stash@{1}: WIP on feature/login: def5678 Implement login form
stash@{2}: WIP on main: ghi9012 Update README
複数のスタッシュがある場合、番号付きで管理されます。
特定のスタッシュの内容を確認する
$ git stash show stash@{1}
login.js | 15 +++++++++
auth.js | 8 ++----
2 files changed, 18 insertions(+), 5 deletions(-)
特定のスタッシュの詳細な差分を確認する
$ git stash show -p stash@{1}
diff --git a/login.js b/login.js
index abc1234..def5678 100644
--- a/login.js
+++ b/login.js
@@ -1,5 +1,20 @@
function login() {
+ const email = document.getElementById('email').value;
+ const password = document.getElementById('password').value;
+
+ if (!email || !password) {
+ alert('Please enter email and password');
+ return;
+ }
特定のスタッシュを復元する
$ git stash pop stash@{1}
On branch feature/login
Changes not staged for commit:
(use \"git add <file>...\" to update the what will be committed)
modified: login.js
modified: auth.js
3-3. 応用的な使い方
スタッシュに説明的なメッセージを付ける
$ git stash save \"WIP: user authentication feature\"
Saved working directory and index state On feature/auth: WIP: user authentication feature
後でスタッシュを確認する際に、どのような変更かが一目瞭然になります。
Untracked filesも含めてスタッシュする
$ git stash -u
Saved working directory and index state WIP on feature/user-profile: abc1234 Add user profile page
オプション「-u」または「–include-untracked」を使うと、追跡されていないファイルもスタッシュに含まれます。
ステージされたファイルのみをスタッシュする
$ git add user.js
$ git stash --keep-index
Saved working directory and index state WIP on feature/user-profile: abc1234 Add user profile page
スタッシュを新しいブランチとして復元する
$ git stash branch feature/restored-from-stash stash@{0}
Switched to a new branch 'feature/restored-from-stash'
On branch feature/restored-from-stash
Changes not staged for commit:
(use \"git add <file>...\" to update the what will be committed)
modified: user.js
modified: profile.html
このコマンドは、スタッシュをベースに新しいブランチを作成し、変更を自動的に復元します。
3-4. 実務的なシナリオ
シナリオ:チームプロジェクトでの緊急対応
#!/bin/bash
# 現在の作業状況を確認
echo \"=== Current Status ===\"
git status
# 変更をスタッシュに保存
echo \"\\n=== Stashing changes ===\"
git stash save \"Feature: Add payment integration - paused for hotfix\"
# 本番環境用のブランチに切り替え
echo \"\\n=== Switching to main branch ===\"
git checkout main
git pull origin main
# 新しい修正用ブランチを作成
echo \"\\n=== Creating hotfix branch ===\"
git checkout -b hotfix/payment-gateway-issue
# 修正作業を行う(省略)
# 元のブランチに戻る
echo \"\\n=== Returning to feature branch ===\"
git checkout feature/payment
# スタッシュを復元
echo \"\\n=== Restoring stashed changes ===\"
git stash pop
echo \"\\n=== Work resumed ===\"
git status
4. よくある間違いと注意点
4-1. スタッシュの内容をうっかり削除してしまう
問題:git stash popで復元したと思ったら、エラーが発生してスタッシュが削除されてしまった。
解決策:git stash applyを使うことで、スタッシュを削除せずに復元できます。
$ git stash apply stash@{0}
$ git status # 確認してから削除
$ git stash drop stash@{0}
4-2. Untracked filesが保存されない
問題:新しく作成したファイルが、git stash後に消えてしまった。
解決策:新規ファイルを含める場合は、-u オプションを使用します。
$ git stash -u
$ git stash -u save \"Including untracked files\"
4-3. コンフリクトが発生する
問題:git stash popで復元する際に、コンフリクトエラーが発生した。
$ git stash pop
Auto-merging user.js
CONFLICT (content): Merge conflict in user.js
解決策:コンフリクトを手動で解決してから、コミットします。
$ git status # コンフリクト内容を確認
$ vim user.js # ファイルを手動で編集
$ git add user.js
$ git commit -m \"Resolve stash conflict\"
4-4. スタッシュが多すぎて管理できない
問題:時間が経つと、どのスタッシュが何か分からなくなる。
解決策:以下の方法で整理します。
$ git stash list # 一覧を確認
$ git stash show stash@{0} # 内容を確認
$ git stash drop stash@{2} # 不要なものを削除
$ git stash clear # すべてを削除(慎重に)
4-5. git stash pop vs git stash apply
重要な違い:
- git stash pop:復元後、スタッシュを削除
- git stash apply:復元後、スタッシュを保持
復元に失敗する可能性がある場合は、applyを使って安全に復元してから、手動でdropすることをお勧めします。
$ git stash apply stash@{0} # 試しに復元
$ git status # 確認
$ git stash drop stash@{0} # 確実に削除
4-6. 古いスタッシュの自動削除
Gitはデフォルトで、30日以上前のスタッシュを自動的に削除します。重要な変更は、必ず復元してコミットするか、ブランチを作成して保存してください。
5. まとめ
Git stashは、開発効率を大幅に向上させることができる便利な機能です。本記事で学んだ要点を整理します:
重要なコマンド
- git stash:変更を一時保存
- git stash list:保存状況を確認
- git stash pop:復元して削除
- git stash apply:復元して保持
- git stash drop:スタッシュを削除
ベストプラクティス
- スタッシュには説明的なメッセージを付ける
- 新規ファイルがある場合は、-u オプションを使う
- 重要な変更は、applyで試してから本確定する
- 長期間保存する場合は、別ブランチを作成する
- 定期的にスタッシュ一覧を整理する
最終的なアドバイス
Git stashは開発の中断と再開をスムーズにする強力なツールです。しかし、完全な代替手段ではありません。重要な変更は、可能な限り早くコミットするか、ブランチとして保存することをお勧めします。git stashは、短期的な作業中断向けに使用するのが最も効果的です。
この記事で紹介したコマンドと使い方を実践すれば、Gitでの開発がより効率的になるでしょう。ぜひ、プロジェクトで活用してください。

